import { cloneDeep, filter, find, forEach } from 'lodash'

/**
 * 将对象数组转成多维对象数组
 * @param arr 要转成多维数组的数组
 * @param id 自身 id 字段
 * @param pid 父级 id 字段
 * @param children 存放子元素的字段, 默认为  children
 * @returns 转换后的多维数组
 */
export const arrToMulArr = (arr: any[], id = 'id', pid = 'pid', children = 'children'): any[] => {
  const data = cloneDeep(arr)
  forEach(data, (item) => {
    const parent = find(data, (res) => res[id] === item[pid])
    if (parent) {
      parent[children] = parent[children] || []
      parent[children].push(item)
    }
  })
  // 自身 id 存在, 且父级 id 不存在或者为 0
  return filter(data, (item) => item[id] && !item[pid])
}

/**
 * 多维对象数组扁平化
 * @param arr 要扁平化的对象数组
 * @param children 存放子元素的字段, 不传时默认为简单数组
 * @returns 扁平化后的一维对象数组
 */
export const flatDeep = (arr: any[], children?: string): any[] => {
  const arr1 = cloneDeep(arr)
  if (children) {
    return arr1.reduce((total, cur) => {
      const arr2 = Array.isArray(cur[children])
        ? flatDeep([{ ...cur, [children]: undefined }, ...cur[children]], children)
        : cur
      return total.concat(arr2)
    }, [])
  }
  return arr1.reduce((total, cur) => total.concat(Array.isArray(cur) ? flatDeep(cur) : cur), [])
}
